<?php

/**
 * 工厂方法
 * 问题: 对于code03_SimpleFactory.php 中的简单工厂，如果再增加一个memcache客户端，就需要再次修改服务端SimpleFactory的代码。
 * 在面向对象设计法则中，有一个重要的 "开闭原则": 对于修改封闭,对于扩展开放. 因此需要使用工厂方法.
 */

/**
 * 定义一个接口,实现缓存的写入
 */
interface Cache {
    function write();
}

/**
 * 服务端实现上面的接口, 此时服务端也不知道将会被谁调用
 */
class FileCache implements Cache {
    public function write() {
        echo '缓存写入文件中' . PHP_EOL;
    }
}

class RedisCache implements Cache {
    public function write() {
        echo '缓存写入Redis中' . PHP_EOL;
    }
}

/**
 * 定义一个工厂接口
 */
interface Factory {
    public static function writeCache();
}

/**
 * 定义多个工厂类，分别实现上面的工厂接口
 */
class FileFactory implements Factory {
    public static function writeCache() {
        $client = new FileCache();
        return $client->write();
    }
}

class RedisFactory implements Factory {
    public static function writeCache() {
        $client = new RedisCache();
        return $client->write();
    }
}

/**
 * 客户端调用
 */
FileFactory::writeCache(); //缓存写入文件中
RedisFactory::writeCache(); //缓存写入Redis中


// ===== 假如现在新增 memcache 客户端, 此时前面的代码不用改,只需要新增如下逻辑
class MemcacheCache implements Cache {
    public function write() {
        echo '缓存写入memcahce' . PHP_EOL;
    }
}

class MemcacheFactory implements Factory {
    public static function writeCache() {
        $client = new MemcacheCache();
        return $client->write();
    }
}

//memcache客户端调用
MemcacheFactory::writeCache(); //缓存写入memcahce